package com.gzz.orchid.common.core.support;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;

import java.util.List;
import java.util.Optional;

/**
 * 生成顺序序号 SerialNumberGenerator 基类
 *
 * @author higmd
 */
public abstract class SerialNoGenerator {
    // 定义一个缺省的key值的前缀
    private final static String DEFAUT_PREFIX_SERIAL = "GM";

    private final RedisTemplate<String, Object> redisTemplate;

    // 构造函数
    public SerialNoGenerator(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 转换成 RedisKey
     *
     * @param key
     * @return
     */
    private static String ToRedisKey(String key) {
        return String.format("%s:%s", DEFAUT_PREFIX_SERIAL, key);
    }

    /**
     * 获取序列IN
     *
     * @return
     */
    protected long getNextSerialId(String key) {
        // 加载Lua脚本文件
        // Resource resource = new ClassPathResource("redis-scripts/batchIncrWithExpire.lua");
        // String luaScript = new String(resource.getInputStream().readAllBytes(), StandardCharsets.UTF_8);

        // Lua脚本内容
        String luaScript = "return redis.call('INCR', KEYS[1])";
        // 创建RedisScript对象
        // RedisScript.of(resource, List.class);
        RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript, Long.class);
        // 执行Lua脚本
        // Long nextId = redisTemplate.execute(script, Collections.emptyList());
        Long nextId = redisTemplate.execute(redisScript, List.of(ToRedisKey(key)));
        return Optional.ofNullable(nextId).orElse(1L);
        //return Optional.ofNullable(redisTemplate.opsForValue().increment(ToRedisKey(key), 1L)).orElse(1L);
    }


}
